package generation;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import org.w3c.dom.Document;

/**
 * GenerateurCode est une classe abstraite de génération de code. Elle nécessite
 * l'implémentation de la méthode genererCode qui doit opérer les modifications
 * sur les fichiers.
 * 
 * @see GenerateurModeleAADL
 * @see GenerateurCodeC
 * 
 */
public abstract class GenerateurCode {

	abstract public void genererCode(Document d, String projectLocation,
			int index);

	/**
	 * replaceString permet de remplacer toutes les occurences d'un motif tag
	 * dans un fichier nommé file par la valeur val.
	 * 
	 * @param file
	 * 		fichier dans lequel les remplacements doivent s'effectuer.
	 * @param tag
	 * 		Motif à remplacer.
	 * @param val
	 * 		Valeur à insérer.
	 * 
	 * @throws IOException
	 * 		si une erreur I/O se produit.
	 */
	protected void replaceString(String file, String tag, String val)
			throws IOException {
		BufferedReader reader = new BufferedReader(new FileReader(file));
		String tmpFile = "/tmp/tmpFile" + (new Date().getTime());
		PrintWriter writer = new PrintWriter(new FileWriter(tmpFile));

		String line = null;
		while ((line = reader.readLine()) != null)
			writer.println(line.replaceAll(tag, val));

		reader.close();
		writer.close();

		copyFile(tmpFile, file);
		File MyFile = new File(tmpFile);
		MyFile.delete();
	}

	/**
	 * copyFile permet de copier l'intégralité d'un fichier dans un autre.
	 * 
	 * @param from
	 * 		fichier d'entrée à copier.
	 * @param to
	 * 		fichier de sortie.
	 * 
	 * @throws IOException
	 * 		si une erreur I/O se produit.
	 */
	protected void copyFile(String from, String to) throws IOException {
		BufferedReader reader = new BufferedReader(new FileReader(from));
		PrintWriter writer = new PrintWriter(new FileWriter(to));

		String line = null;
		while ((line = reader.readLine()) != null) {
			writer.println(line);
		}

		reader.close();
		writer.close();
	}
}
